package org.wltea.analyzer.dic;

import java.io.IOException;

import org.apache.http.Header;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpHead;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.wltea.analyzer.help.Sleep;
import org.wltea.analyzer.help.Sleep.Type;

public class Monitor implements Runnable {
	
	private static CloseableHttpClient httpclient = HttpClients.createDefault();
	/*
	 * 上次更改时间
	 */
	private String last_modified;
	/*
	 * 资源属性
	 */
	private String eTags;
	
	/*
	 * 请求地址
	 */
	private String location; 
	
	public Monitor(String location) {
		this.location = location;
		this.last_modified = null;
		this.eTags = null;
	}
	/**
	 * 监控流程：
	 *  ①向词库服务器发送Head请求
	 *  ②从响应中获取Last-Modify、ETags字段值，判断是否变化
	 *  ③如果未变化，休眠1min，返回第①步
	 * 	④如果有变化，重新加载词典
	 *  ⑤休眠1min，返回第①步
	 */
	
	public void run() {
		//超时设置
		RequestConfig rc = RequestConfig.custom().setConnectionRequestTimeout(10*1000)
				.setConnectTimeout(10*1000).setSocketTimeout(15*1000).build();
		while (true) {
			HttpHead head = new HttpHead(location);
			head.setConfig(rc);
			
			//设置请求头
			if (last_modified != null) {
				head.setHeader("If-Modified-Since", last_modified);
			}
			if (eTags != null) {
				head.setHeader("If-None-Match", eTags);
			}
			
			CloseableHttpResponse response = null;
			try {
				response = httpclient.execute(head);
				
				//返回304 Not Modified，词库未更新
				if(response.getStatusLine().getStatusCode()==304){
					continue;
				}else if(response.getStatusLine().getStatusCode()==200){
				
					if (!response.getLastHeader("Last-Modified").getValue().equalsIgnoreCase(last_modified)
						||!response.getLastHeader("ETags").getValue().equalsIgnoreCase(eTags)) {
	
						// 远程词库有更新,需要重新加载词典，并修改last_modified,eTags
						Dictionary.getSingleton().reLoadMainDict();
						last_modified = response.getLastHeader("Last-Modified")==null?null:response.getLastHeader("Last-Modified").getValue();
						eTags = response.getLastHeader("ETags")==null?null:response.getLastHeader("ETags").getValue();
					}
				}
				
			} catch (ClientProtocolException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}finally{
				try {
					response.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				Sleep.sleep(Type.SEC, 60);
			}
		}	
	}
	
}
